﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SIAD.Model
{
    class IAStrategyFactory
    {
        /// <summary>
        /// La liste des IA
        /// </summary>
        private List<String> _IATypeList;
        public List<String> IATypeList { get { return _IATypeList; } }

        /// <summary>
        /// Constructeur privé pour éviter une instanciation du singleton par un autre classe
        /// </summary>
        private IAStrategyFactory()
        {
            // Ici créer la liste par réflexion
            _IATypeList = new List<string>();
            _IATypeList.Add(Common.HUMAN);
            _IATypeList.Add(Common.MIN_MAX);
            _IATypeList.Add(Common.NEGA_MAX);
            _IATypeList.Add(Common.ALPHA_BETA);
        }

        /// <summary>
        /// La classe privé qui instancie le singleton
        /// </summary>
        private static class SingletonHolder
        {
            public static IAStrategyFactory instance = new IAStrategyFactory();
        }

        /// <summary>
        /// Permet de récupérer l'instance du singleton
        /// </summary>
        /// <returns></returns>
        public static IAStrategyFactory getInstance()
        {
            return SingletonHolder.instance;
        }

        /// <summary>
        /// Crée une strategie d'intelligence artificielle humaine par défaut
        /// </summary>
        /// <returns>la stratégie</returns>
        public IAStrategy createDefaultStrategy(Plateau thePlateau, Common.CASE_TYPE thePlayerType )
        {
            return createStrategy(Common.HUMAN,thePlateau,thePlayerType);
        }

        /// <summary>
        /// Crée la stratégie voulue
        /// </summary>
        /// <param name="theStrategyName"> le nom de la stratégie souhaité</param>
        /// <returns>la stratégie</returns>
        public IAStrategy createStrategy(String theStrategyName, Plateau thePlateau, Common.CASE_TYPE thePlayerType)
        {            
            IAStrategy theStrategy = new HumanStrategy(thePlateau,thePlayerType);
            switch (theStrategyName)
            {
                case Common.MIN_MAX:
                    theStrategy = new MinMaxStrategy(thePlateau, thePlayerType);
                    break;
                case Common.NEGA_MAX:
                    theStrategy = new NegaMaxStrategy(thePlateau, thePlayerType);
                    break;
                case Common.ALPHA_BETA:
                    theStrategy = new AlphaBetaStrategy(thePlateau, thePlayerType);
                    break;
                case Common.HUMAN:
                default:
                    // Montre bien que le défaut est la stratégie humaine
                    break;
            }

            return theStrategy;
        }
    }
}
